// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
 **********************************************************************
 * Copyright (c) 2003-2010, International Business Machines
 * Corporation and others.  All Rights Reserved.
 **********************************************************************
 * Author: Alan Liu
 * Created: October 2 2003
 * Since: ICU 2.8
 **********************************************************************
 */

package com.ibm.icu.impl;

import com.ibm.icu.util.TimeZone;
import java.util.Date;

/**
 * <code>TimeZoneAdapter</code> wraps a com.ibm.icu.util.TimeZone subclass and inherits from
 * java.util.TimeZone. Without this class, we would need to 'port' java.util.Date to
 * com.ibm.icu.util as well, so that Date could interoperate properly with the com.ibm.icu.util
 * TimeZone and Calendar classes. With this class, we can use java.util.Date together with
 * com.ibm.icu.util classes.
 *
 * @see com.ibm.icu.util.TimeZone#setDefault
 * @author Alan Liu
 * @since ICU 2.8
 */
public class TimeZoneAdapter extends java.util.TimeZone implements Cloneable {

    // Generated by serialver from JDK 1.4.1_01
    static final long serialVersionUID = -2040072218820018557L;

    /**
     * The contained com.ibm.icu.util.TimeZone object. Must not be null. We delegate all methods to
     * this object.
     */
    private TimeZone zone;

    /**
     * Given a java.util.TimeZone, wrap it in the appropriate adapter subclass of
     * com.ibm.icu.util.TimeZone and return the adapter.
     */
    public static java.util.TimeZone wrap(com.ibm.icu.util.TimeZone tz) {
        return new TimeZoneAdapter(tz);
    }

    /** Return the java.util.TimeZone wrapped by this object. */
    public com.ibm.icu.util.TimeZone unwrap() {
        return zone;
    }

    /** Constructs an adapter for a com.ibm.icu.util.TimeZone object. */
    public TimeZoneAdapter(TimeZone zone) {
        this.zone = zone;
        super.setID(zone.getID());
    }

    /** TimeZone API; calls through to wrapped time zone. */
    @Override
    public void setID(String ID) {
        super.setID(ID);
        zone.setID(ID);
    }

    /** TimeZone API; calls through to wrapped time zone. */
    @Override
    public boolean hasSameRules(java.util.TimeZone other) {
        return other instanceof TimeZoneAdapter
                && zone.hasSameRules(((TimeZoneAdapter) other).zone);
    }

    /** TimeZone API; calls through to wrapped time zone. */
    @Override
    public int getOffset(int era, int year, int month, int day, int dayOfWeek, int millis) {
        return zone.getOffset(era, year, month, day, dayOfWeek, millis);
    }

    /** TimeZone API; calls through to wrapped time zone. */
    @Override
    public int getRawOffset() {
        return zone.getRawOffset();
    }

    /** TimeZone API; calls through to wrapped time zone. */
    @Override
    public void setRawOffset(int offsetMillis) {
        zone.setRawOffset(offsetMillis);
    }

    /** TimeZone API; calls through to wrapped time zone. */
    @Override
    public boolean useDaylightTime() {
        return zone.useDaylightTime();
    }

    /** TimeZone API; calls through to wrapped time zone. */
    @Override
    public boolean inDaylightTime(Date date) {
        return zone.inDaylightTime(date);
    }

    /** Boilerplate API; calls through to wrapped object. */
    @Override
    public TimeZoneAdapter clone() {
        return new TimeZoneAdapter(zone.clone());
    }

    /** Boilerplate API; calls through to wrapped object. */
    @Override
    public synchronized int hashCode() {
        return zone.hashCode();
    }

    /** Boilerplate API; calls through to wrapped object. */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof TimeZoneAdapter) {
            TimeZone anotherZone = ((TimeZoneAdapter) obj).zone;
            return zone.equals(anotherZone);
        }
        return false;
    }

    /**
     * Returns a string representation of this object.
     *
     * @return a string representation of this object.
     */
    @Override
    public String toString() {
        return "TimeZoneAdapter: " + zone.toString();
    }
}
